/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package kayttoliittyma;

import opintopaivakirja.*;
import opintopaivakirja.Kayttaja;
import opintopaivakirja.Projekti;

import java.io.FileOutputStream;
import java.io.IOException;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.FontFactory;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;
import com.lowagie.text.Phrase;
//import com.lowagie.text.rtf.RtfWriter2;
import com.lowagie.text.rtf.RtfWriter2;
import java.io.File;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

/**
 *
 * @author tommi
 */
public class Tulostus {

    private Kayttaja kayttaja;
    private Projekti projekti;

    /**
     *
     * @param kayttaja
     * @param projekti
     */
    public Tulostus(javax.swing.JDialog parent, Kayttaja kayttaja, Projekti projekti, String pvm, boolean mpOtsikkoStatic, int fonttiValinta) {
        this.kayttaja = kayttaja;
        // this.projekti = projekti;

        System.out.println("Tulostusruutu avattu");

        String fontti = FontFactory.TIMES;

        if (fonttiValinta == 1) {
            fontti = FontFactory.TIMES;
        }
        if (fonttiValinta == 2) {
            fontti = FontFactory.COURIER;
        }
        if (fonttiValinta == 3) {
            fontti = FontFactory.HELVETICA;
        }

        // Määritellään muuttujat
        String hnimi = null;
        //Projektitiedot
        String pnimi = null;
        String pkuvaus = null;
        String plinkki = null;
        String arviointiteksti = null;
        String lapsiprojektilistaus = null;




        String arviointiotsikkostatic = "Arviointi";
        String mpotsikkostatic = "Muistiinpanot";
        String aliprojektitotsikkostatic = "Aliprojektit";

         // "Arviointitekstiä, Arviointitekstiä, Arviointitekstiä, Arviointitekstiä, Arviointitekstiä, Arviointitekstiä";

        // step 1: creation of a document-object
        Document document = new Document(PageSize.A4, 50, 50, 30, 50);  // Muodostetaan uusi dokumentti, joka on A4-kokoa ja marginaalit 20mm joka reunasta
        //Sivukoko, oikea, vasen, ylä, ala
        try {

            JFileChooser fc = new JFileChooser();
            fc.setDialogTitle("Anna tiedostonimi");
            fc.addChoosableFileFilter(new TulostaRTF());
            fc.addChoosableFileFilter(new TulostaPDF());
            fc.setAcceptAllFileFilterUsed(false);                       // Ei näytä muita kuin kansioita, rtf:iä ja pdf:iä
            int returnVal = fc.showDialog(parent, "Tallenna");
            String tiedostotyyppi = fc.getFileFilter().getDescription();

            if (returnVal == JFileChooser.ERROR_OPTION) {
                System.out.println("Tiedostonkäsittelyvirhe");
            } else if (returnVal == JFileChooser.APPROVE_OPTION) {
                File file = fc.getSelectedFile();
                System.out.println(file.getName());
                String ext = Utils.getExtension(file);

                if (ext != null) { // Estetään tuplatiedostopääte
                    System.out.println("Tulostetaan tiedosto");
                    System.out.println("Printing: " + file.getAbsolutePath() + ".");
                    PdfWriter.getInstance(document, new FileOutputStream(file.getAbsolutePath()));
                } else if (tiedostotyyppi.equals("PDF-tiedosto (*.pdf)")) {
                    System.out.println("Tulostetaan PDF-tiedosto" + file.getAbsolutePath() + ".pdf");
                    PdfWriter.getInstance(document, new FileOutputStream(file.getAbsolutePath() + ".pdf"));

                } else {
                    System.out.println("Tulostetaan RTF-tiedosto" + file.getAbsolutePath() + ".rtf");
                    RtfWriter2.getInstance(document, new FileOutputStream(file.getAbsolutePath() + ".rtf"));
                }

                document.open();


                Paragraph projektitiedot = new Paragraph();
                Paragraph muistiinpano = new Paragraph();
                Paragraph arviointi = new Paragraph();
                Paragraph aliprojekti = new Paragraph();

                // Käyttäjätiedot ylänurkkaa
                System.out.println(kayttaja.getEtunimi());
                if (kayttaja.getEtunimi() != null || kayttaja.getSukunimi() != null || kayttaja.getOtunnus() != null || kayttaja.getRtunnus() != null || kayttaja.getSahkoposti() != null || pvm != null) {
                    Paragraph henkilotiedot = new Paragraph();
                    // jos etunimi ja sukunimi
                    if (kayttaja.getEtunimi() != null && kayttaja.getSukunimi() != null) {
                        hnimi = kayttaja.getEtunimi() + " " + kayttaja.getSukunimi();
                        Phrase henkilonimi = luoYlaTunniste(hnimi, fontti);
                        henkilotiedot.add(henkilonimi);
                    } // Jos vain Etunimi tai sukunimi
                    else if (kayttaja.getSukunimi() != null || kayttaja.getSukunimi() != null) {
                        if (kayttaja.getEtunimi() != null) {
                            hnimi = kayttaja.getEtunimi();
                        } else {
                            hnimi = kayttaja.getSukunimi();
                        }
                        Phrase henkilonimi = luoYlaTunniste(hnimi, fontti);
                        henkilotiedot.add(henkilonimi);
                    }
                    // Jos otunnus
                    if (kayttaja.getOtunnus() != null) {
                        String hOtunnus = kayttaja.getOtunnus();
                        Phrase henkiloOtunnus = luoYlaTunniste(hOtunnus, fontti);
                        henkilotiedot.add(henkiloOtunnus);
                    }
                    // Jos rtunnus
                    if (kayttaja.getRtunnus() != null) {
                        String hRtunnus = kayttaja.getRtunnus();
                        Phrase henkiloRtunnus = luoYlaTunniste(hRtunnus, fontti);
                        henkilotiedot.add(henkiloRtunnus);
                    }
                    // Jos email
                    if (kayttaja.getSahkoposti() != null) {
                        String hEmail = kayttaja.getSahkoposti();
                        Phrase henkiloSahkoPosti = luoYlaTunniste(hEmail, fontti);
                        henkilotiedot.add(henkiloSahkoPosti);
                    }
                    if (pvm != null) {
                        Phrase paivamaara = luoYlaTunniste(pvm, fontti);
                        henkilotiedot.add(paivamaara);
                    }
                    henkilotiedot.setAlignment(Element.ALIGN_RIGHT);
                    document.add(henkilotiedot);
                }

                // Projektitiedot
                if (projekti.getNimi() != null || projekti.getEsittely() != null || projekti.getLinkki() != null) {
                    //Lisätään otsikko projektille
                    pnimi = projekti.getNimi();
                    Phrase projektiOtsikko = luoOtsikko(pnimi, fontti);
                    projektitiedot.add(projektiOtsikko);

                    //Lisätään projektin esittely / kuvaus
                    if (projekti.getEsittely() != null) {
                        pkuvaus = projekti.getEsittely();
                        Phrase kuvausOtsikko = luoValiOtsikko("Kuvaus: ", fontti);
                        Phrase kuvausTeksti = luoValiTeksti(pkuvaus, fontti);
                        projektitiedot.add(kuvausOtsikko);
                        projektitiedot.add(kuvausTeksti);
                    }
                    // Lisätään projektin kotisivu
                    if (projekti.getLinkki() != null) {
                        plinkki = projekti.getLinkki();
                        Phrase kotisivuOtsikko = luoValiOtsikko("Kotisivu: ", fontti);
                        Phrase kotisivuLinkki = luoLinkki(plinkki, fontti); // TODO tutki miten tehdään klikattava linkki
                        projektitiedot.add(kotisivuOtsikko);
                        projektitiedot.add(kotisivuLinkki);
                    }

                    document.add(projektitiedot);
                }

                if (mpOtsikkoStatic) {
                    Phrase mpotsikkostaticP = luoOtsikko(mpotsikkostatic, fontti);
                    muistiinpano.add(mpotsikkostaticP);
                    System.out.println("Lisataan mpotsikkoa");
                }

                // Lisätään muistiinpanot
                System.out.println("Projektin muistiipanojen lukumäärä " + projekti.getMuistiinpanot().size());

                if (projekti.getMuistiinpanot().size() > 0) {
                    for (Muistiinpano tavoite : projekti.getMuistiinpanot()) {
                        if (tavoite instanceof Tavoite) {
                            Phrase tavoiteP = luoValiOtsikko1(tavoite.getOtsikko(), fontti);
                            muistiinpano.add(tavoiteP);

                            //String tavoiteotsikko = tavoite.getOtsikko(); // Tavoite, eli otsikko
                            //Phrase tavoiteOtsikko = luoOtsikko(tavoiteotsikko, fontti);
                            //muistiinpano.add(tavoiteOtsikko);
                            System.out.println("Lisätään tavoitetta");

                            for (Muistiinpano memo : projekti.getMuistiinpanot()) {
                                if (memo.getIsa() == tavoite.getId()) { // jos muistiinpano kuuluu tavoitteen alle
                                    // String memo_teksti = ; // Tavoitteen alle kuuluva mp
                                    Phrase mpTeksti = luoLeipaTeksti(memo.getAsia(), fontti);
                                    muistiinpano.add(mpTeksti);
                                    System.out.println("Lisätään muistiinpanoa");

                                    if (memo.getLinkit().size() > 0) {
                                        Phrase mpLinkki = luoLinkki(memo.getLinkit().get(0).getUrl(), fontti);
                                        muistiinpano.add(mpLinkki);
                                    }
                                }
                            }
                        }
                    }
                    document.add(muistiinpano);
                }
                
                if (projekti.getArviointi()!=null){
                    arviointiteksti = projekti.getArviointi();
                    Phrase arviointiOtsikko = luoOtsikko(arviointiotsikkostatic, fontti);
                    Phrase arviointiTeksti = luoLeipaTeksti(arviointiteksti, fontti);
                    arviointi.add(arviointiOtsikko);
                    arviointi.add(arviointiTeksti);

                    document.add(arviointi);
                    
                }


                // Tämä koodipätkä ei toimi. Pitäisi tulostaa aliprojektit
//                if (projekti.getLapsiprojektit()!=null){
//                    lapsiprojektilistaus = projekti.getLapsiprojektit().get(0).getNimi();
//                    Phrase aliProjektiOtsikko = luoOtsikko(aliprojektitotsikkostatic, fontti);
//                    Phrase aliProjektiListaus = luoLeipaTeksti(lapsiprojektilistaus, fontti);
//                    aliprojekti.add(aliProjektiOtsikko);
//                    aliprojekti.add(aliProjektiListaus);
//
//                    document.add(aliprojekti);
//                }

                //TODO järjestelmän herjat jos kirjoitus ei onnistu

            } else {
                System.out.println("Save command cancelled by user.");
                JOptionPane.showMessageDialog(parent, "Peruutit tulostuksen");
            }

        } catch (DocumentException de) {
            System.err.println(de.getMessage());
            JOptionPane.showMessageDialog(parent, "Virhe: "+de);
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
            JOptionPane.showMessageDialog(parent, "Virhe: "+ioe);
        }

        // step 5: we close the document
        document.close();



    }

    /**
     * Antaa käyttäjälle tiedon siitä, onko dokumentti tulostettu oikein.
     */
    public void tulostettuDokumentti() {
        System.out.println("Dokumentti tulostettu");
        //TODO Tulostuksen onnistumisen informaatiolätkä
    }

    /**
     * Määrittelee tekstityylin ja tekstin käytettäväksi iText dokumentin kanssa.
     * @param teksti Vastaanottaa tekstin, johon muotoilu tehdään
     * @param fontti Vastaanottaa String-tyyppisen tekstin, jossa kerrotaan, mitä fonttia käytetään.
     * Vaihtoehdot: FontFactory.TIMES, FontFactory.COURIER, FontFactory.HELVETICA
     * @return Palauttaa fraasin (Phrase), jota voidaan käyttää uuden tekstikentän muotoiluun leipätekstiksi (valittu fontti ja fonttikoko 12)
     */
    private Phrase luoLeipaTeksti(String teksti, String fontti) {
        Phrase fraasi = new Phrase("\n" + teksti + "\n", FontFactory.getFont(fontti, 12));
        return fraasi;
    }

    /**
     * Muotoilee linkin sopivaksi tulostukseen
     * @param linkki Vastaanottaa linkkitekstin, jolle muotoilu tehdään
     * @param fontti Määrittelee fontin. Vaihtoehdot: FontFactory.TIMES, FontFactory.COURIER, FontFactory.HELVETICA
     * @return Palauttaa sopivan muotoisen fraasin.
     */
    private Phrase luoLinkki(String linkki, String fontti) {
        Phrase fraasi = new Phrase(linkki + "\n", FontFactory.getFont(fontti, 12));
        return fraasi;
    }

    /**
     * Muotoilee otsikkokentät. Käyttötapa: Phrase fraasi = luoOtsikko(teksti, fontti);
     * @param otsikko Vastaanottaaa otsikkotekstin
     * @param fontti Vastaanottaa fonttitekstin. Vaihtoehdot: FontFactory.TIMES, FontFactory.COURIER, FontFactory.HELVETICA
     * @return otsikkomuotoiltu fraasi
     */
    private Phrase luoOtsikko(String otsikko, String fontti) {

        Phrase fraasi = new Phrase("\n" + otsikko + "\n", FontFactory.getFont(fontti + "_BOLD", 15));
        return fraasi;
    }

    /**
     * Palauttaa käyttäjälle muotoillun väliotsikkotekstin, jossa ei ole välilyöntiä ennen tekstiä. Käytetään luoValiTeksti-metodin jälkeiseen tekstiin. Käyttötapa: Phrase fraasi = luoYlaTunniste(yla, fontti);
     * @param valiotsikko  Väliotsikon teksti
     * @param fontti  Väliotsikon haluttu fontti. Vaihtoehdot: FontFactory.TIMES, FontFactory.COURIER, FontFactory.HELVETICA Ei saa käyttää _BOLD lisämäärettä, koska se tehdään automaattisesti
     * 
     * @return väliotsikon muotoilulla oleva teksti
     *
     */
    private Phrase luoValiOtsikko(String valiotsikko, String fontti) {
        Phrase fraasi = new Phrase("\n" + valiotsikko, FontFactory.getFont(fontti + "_BOLD", 12));
        return fraasi;
    }

    private Phrase luoValiOtsikko1(String otsikko, String fontti) {
        Phrase fraasi = new Phrase("\n" + otsikko + "\n", FontFactory.getFont(fontti + "_BOLD", 12));
        return fraasi;
    }

    /**
     * Palauttaa käyttäjälle tekstikentän, jolle ei ole rivivälejä. Tällä voi siis kirjoittaa tekstejä peräkkäin eri fontein. Käyttötapa: Phrase fraasi = luoYlaTunniste(yla, fontti);
     * @param valiteksti Vastaanottaa tekstiä
     * @param fontti Vastaanottovaihtoehdot: FontFactory.TIMES, FontFactory.COURIER, FontFactory.HELVETICA
     * @return fraasi, jonka perään tulee suoraan seuraava teksti, ei siis rivinvaihtoa tekstiä ennen eikä jälkeen.
     */
    private Phrase luoValiTeksti(String valiteksti, String fontti) {
        Phrase fraasi = new Phrase(valiteksti, FontFactory.getFont(fontti, 12));
        return fraasi;
    }

    /**
     * Muotoilee ylätunnisteen tekstit Käyttötapa: Phrase fraasi = luoYlaTunniste(yla, fontti);
     * @param ylatunniste Vastaanottaa ylätunnisteeseen tulevat tekstit
     * @param fontti vastaanottovaihtoehdot: FontFactory.TIMES, FontFactory.COURIER, FontFactory.HELVETICA
     * @return
     */
    private Phrase luoYlaTunniste(String ylatunniste, String fontti) {
        Phrase fraasi = new Phrase(ylatunniste + "\n", FontFactory.getFont(fontti, 11));
        return fraasi;
    }
}
